home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 2 / Amiga Tools 2.iso / tools / packer / xpkarchive / examples / xarc.c < prev    next >
C/C++ Source or Header  |  1995-03-09  |  5KB  |  153 lines

  1. #include <stdlib.h>
  2. #include <libraries/xpkarchive.h>
  3.  
  4. struct Library *XpkArchiveBase;
  5.  
  6. #define BUFSIZE 4096L
  7.  
  8. char buffer[BUFSIZE];
  9.  
  10. int   chkabort(void) { return 0; }           /* disable SAS ^C handling */
  11. long __asm chunkfunc(register __a1 struct XpkProgress *prog);
  12. struct Hook chunkhook = {{0},chunkfunc};
  13.  
  14. main(argc,argv)
  15. int argc;
  16. char *argv[];
  17. {
  18.    ULONG Error;
  19.    XarHandle *arc;
  20.    short a;
  21.    short uncompress=0;
  22.    short list=0;
  23.    int base=1;
  24.  
  25.    char *mode="NUKE";
  26.  
  27.    if(argc<3) {
  28.       printf("Usage: %s [-m|-x|-l] <archive> <file1> [<file2> ...]\n",argv[0]);
  29.       exit(0);
  30.    }
  31.  
  32.    if(!strcmp("-m",argv[1])) {
  33.       mode=argv[2];
  34.       base=3;
  35.    } else if(!strcmp("-l",argv[1])) {
  36.       list=1;
  37.       base=2;
  38.    } else if(!strcmp("-x",argv[1])) {
  39.       uncompress=1;
  40.       base=2;
  41.    }
  42.  
  43.  
  44.    if(!(XpkArchiveBase=OpenLibrary("xpkarchive.library",0L))) {
  45.       fprintf(stderr,"Cannot open xpkarchive.library\n");
  46.       exit(0);
  47.    }
  48.  
  49.    if(!(arc=XarOpenArchive(XAR_ArchiveName,argv[base],
  50.                             XAR_ArchiveMode,XAR_ModeAppend,
  51.                             XAR_Error,&Error,
  52.                             TAG_DONE))) {
  53.       printf("Fatal Error: %ld\n",Error);
  54.       CloseLibrary(XpkArchiveBase);
  55.       exit(0);
  56.    }
  57.  
  58.    printf("Returncode: %ld\n",Error);
  59.  
  60.    if(list) {
  61.       ULONG sum1=0,sum2=0;
  62.       float ratio;
  63.       XarLock *lock;
  64.       struct FileData *data;
  65.       puts("Original Packed Ratio  Date     Time   Gen Mode Name\n"
  66.            "-------- ------ ---- -------- -------- --- ---- ----------");
  67.       for(lock=XarGetLock(arc);lock;lock=XarNextLock(lock)) {
  68.          ULONG compsize;
  69.  
  70.          data=XarGetFileData(lock);
  71.          compsize=XarGetFileSize(lock);
  72.          sum1+=data->Filesize;
  73.          sum2+=compsize;
  74.  
  75.          if(data->Filesize==0) ratio=0; else ratio=100.0-100*(float)compsize/data->Filesize;
  76.          if(XarIsXpkArchive(arc)) {
  77.             ULONG pname[2];
  78.             struct XpkFib fib;
  79.             XarExamine(lock,&fib);
  80.             pname[0]=fib.ID;
  81.             pname[1]=0;
  82.             printf("%8lu %6lu %2.1f %2d.%02d.%02d %2d:%02d:%02d %3d %4s %s\n",
  83.                     data->Filesize,compsize,ratio,data->Time.Day,data->Time.Month,
  84.                     data->Time.Year,data->Time.Hour,data->Time.Min,data->Time.Sec,
  85.                     data->Generation+1,pname,XarGetFileName(lock));
  86.          } else {
  87.             printf("%8lu %6lu %2.1f %2d.%02d.%02d %2d:%02d:%02d %3d %4d %s\n",
  88.                     data->Filesize,compsize,ratio,data->Time.Day,data->Time.Month,
  89.                     data->Time.Year,data->Time.Hour,data->Time.Min,data->Time.Sec,
  90.                     data->Generation+1,data->Method,XarGetFileName(lock));
  91.          }
  92.          if(XarGetFileNote(lock)) puts(XarGetFileNote(lock));
  93.       }
  94.       puts("-------- ------ ----");
  95.       if(sum1==0) ratio=0; else ratio=100.0-100*(float)sum2/sum1;
  96.       printf("%8lu %6lu %2.1f\n",sum1,sum2,ratio);
  97.    } else if(uncompress) {
  98.       for(a=base+1;a<argc;a++) {
  99.          char tmp[100],*p;
  100.          int gen=0;
  101.          strcpy(tmp,argv[a]);
  102.          if(p=rindex(tmp,',')) {
  103.             if(sscanf(p+1,"%d",&gen)!=1) {
  104.                fprintf(stderr,"Invalid generation\n");
  105.                goto ExitFail;
  106.             }
  107.             *p=0;
  108.             gen--;
  109.          }
  110.          printf("Generation %d\n",gen+1);
  111.          XarExtractFile(XAR_OutName,argv[a],XAR_FileName,tmp,
  112.                     XAR_Generation,(ULONG)gen,
  113.                     XAR_Archive,arc,XAR_Error,&Error,
  114.                     TAG_DONE);
  115.          printf("Error: %ld\n",Error);
  116.       }
  117.    } else {
  118.       for(a=base+1;a<argc;a++) {
  119.          char *basename,*p;
  120.          p=index(argv[a],':');
  121.          basename=p?p+1:argv[a]; /* Name without volume name */
  122.          if(*basename=='/') basename++;
  123.          XarAddFile(XPK_InName,argv[a],XAR_FileName,basename,
  124.                     XAR_Archive,arc,XAR_Error,&Error,
  125.                     XPK_PackMethod,mode,
  126.                     XPK_ChunkHook,&chunkhook,TAG_DONE);
  127.          printf("Error: %ld\n",Error);
  128.  
  129.       }
  130.    }
  131. ExitFail:
  132.    XarCloseArchive(arc);
  133.    CloseLibrary(XpkArchiveBase);
  134. }
  135.  
  136.  
  137. long __asm chunkfunc(register __a1 struct XpkProgress *prog)
  138. {
  139.    if( prog->Type!=XPKPROG_END ) {
  140.       printf("%4s: %-8s (%3ld%% done, %2ld%% CF, %6ld cps) %s\033[K\r",
  141.          prog->PackerName,  prog->Activity,   prog->Done,
  142.          prog->CF,          prog->Speed,      prog->FileName);
  143.       fflush(stdout);
  144.    } else {
  145.       printf("%4s: %-8s (%3ldK, %2ld%% CF, %6ld cps) %s\033[K\n",
  146.          prog->PackerName,  prog->Activity,   prog->ULen/1024,
  147.          prog->CF,          prog->Speed,      prog->FileName);
  148.  
  149.    }
  150.    return (long)SetSignal(0, SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C;
  151. }
  152.  
  153.